﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication27
{
    public partial class Liczba
    {
        

        public static Liczba operator /(Liczba a, Liczba b)
        {
            int ktora = Pomoce.Porownaj(a, b);

            if (ktora == 1)
            {
                int dlugoscb = b.element.Count;
                int dlugosca = a.element.Count;
                int dlugosc = 1;
                int pomin = 0;
                

                char znak;
                if (a.znak == b.znak) znak = a.znak; else znak = '-';
               

                Liczba temp = new Liczba(a.system);
                

                List<ElementDzielenia> list = new List<ElementDzielenia>();
                list.Add(new ElementDzielenia(new Liczba("1",a.system),b));
                Liczba dwojka = new Liczba("2",a.system);

                List<ulong> calkowitywynik = new List<ulong>();

                while (dlugosca > 0)
                {
                    if (dlugosca > dlugoscb) { dlugosc = dlugoscb; } else dlugosc = dlugosca;
                    if (temp.element[0] == 0)
                    {
                        temp.element.RemoveAt(0);
                        temp.element.AddRange(a.element.Skip(pomin).Take(dlugosc));
                        dlugosca++;
                        pomin--;

                    }
                    else
                    temp.element.AddRange(a.element.Skip(pomin).Take(dlugosc+1));
                   


                    Liczba wynik = new Liczba(a.system);

                    if (Pomoce.Porownaj(temp, list[list.Count - 1].mnozona) == 1)
                    {

                        while (Pomoce.Porownaj(list[list.Count - 1].mnozona, temp) != 1)
                        {
                            Liczba potega = list[list.Count - 1].potegadwojki * dwojka;
                            Liczba mnozona = list[list.Count - 1].mnozona * dwojka;
                            list.Add(new ElementDzielenia(potega,mnozona));
                        }
                    }

                    for (int i = list.Count-1; i >= 0; i--)
                    {
                        if (Pomoce.Porownaj(temp, list[i].mnozona) != 0)
                        {
                            temp = temp - list[i].mnozona;
                            wynik = wynik + list[i].potegadwojki;

                        }
                    }
                    pomin += dlugosc+1;
                    dlugosca = dlugosca - (dlugoscb + 1);
                    calkowitywynik.AddRange(wynik.element);
                 
                }
                if(calkowitywynik[0]==0) calkowitywynik.RemoveAt(0);

             
                return new Liczba(calkowitywynik,a.system,znak);


            }
            else if (ktora == 2) return new Liczba("1",a.system);
            else return new Liczba(a.system);
           

          
        }

        public static Liczba operator %(Liczba a, Liczba b)
        {
            int ktora = Pomoce.Porownaj(a, b);

            if (ktora == 1)
            {
                int dlugoscb = b.element.Count;
                int dlugosca = a.element.Count;
                int dlugosc = 1;
                int pomin = 0;


                char znak;
                if (a.znak == b.znak) znak = a.znak; else znak = '-';


                Liczba temp = new Liczba(a.system);


                List<ElementDzielenia> list = new List<ElementDzielenia>();
                list.Add(new ElementDzielenia(new Liczba("1", a.system), b));
                Liczba dwojka = new Liczba("2", a.system);

                List<ulong> calkowitywynik = new List<ulong>();

                while (dlugosca > 0)
                {
                    if (dlugosca > dlugoscb) { dlugosc = dlugoscb; } else dlugosc = dlugosca;
                    if (temp.element[0] == 0)
                    {
                        temp.element.RemoveAt(0);
                        temp.element.AddRange(a.element.Skip(pomin).Take(dlugosc));
                        dlugosca++;
                        pomin--;

                    }
                    else
                        temp.element.AddRange(a.element.Skip(pomin).Take(dlugosc + 1));



                    Liczba wynik = new Liczba(a.system);

                    if (Pomoce.Porownaj(temp, list[list.Count - 1].mnozona) == 1)
                    {

                        while (Pomoce.Porownaj(list[list.Count - 1].mnozona, temp) != 1)
                        {
                            Liczba potega = list[list.Count - 1].potegadwojki * dwojka;
                            Liczba mnozona = list[list.Count - 1].mnozona * dwojka;
                            list.Add(new ElementDzielenia(potega, mnozona));
                        }
                    }

                    for (int i = list.Count - 1; i >= 0; i--)
                    {
                        if (Pomoce.Porownaj(temp, list[i].mnozona) != 0)
                        {
                            temp = temp - list[i].mnozona;
                            wynik = wynik + list[i].potegadwojki;

                        }
                    }
                    pomin += dlugosc + 1;
                    dlugosca = dlugosca - (dlugoscb + 1);
                    calkowitywynik.AddRange(wynik.element);

                }
               


                return temp;


            }
            else if (ktora == 2) return new Liczba(a.system);
            else return a;



        }
       
    }

    
}
